Async Selector: APIは「叩く」のではなく「叩かれる」もの
手続きに関わる状態が増えれば増えるほど整合性を保つのが難しくなる 例
ステップを進んだタイミングではじめて依存値が確定する
依存データの状態遷移で考慮することが増える
いつセットされる?ライフサイクルを把握するのが難しい
コンポーネントのコード読みに行かないとどうなってるかわからない
データフローが追いづらい
API系の処理がコンポーネントに委ねられる
イベントハンドラで叩くか、マウントで叩くか?
何度も叩かれないか?
エラー時は?
親が子の振る舞いに依存するケースがでてきてしまう
以下の意見は、技術の螺旋により過去のものとなる可能性はある 前提知識として以下を読んでおくといいかも
---
UI = Component(state)
より現代的にすると、
このclient()の内側の式がフロントエンドの複雑性のもとである server(data) * state
ここをシンプルにして考えたい
この式を分割すると以下のように構成できる
code:md
1. data = (serverState * clientState) // クライアントとサーバーの依存状態をかけあわせる
2. UI = Component(data) // 純粋なレンダリング処理
UIは多くの場合複数の要素の集合体であり、宣言的UIを構築する際はリソースの依存関係を見抜くことが重要 いわば 「状態の状態」のようなものが生まれ、その依存関係を把握できなくなる
複数のhooksを組み合わせようとすると途端に辛くなる
---
コンポーネントがレンダリングだけに集中できるように状態遷移の関心を分離する
1. コンポーネントがイベントをハンドリングする
2. 状態遷移が起こる
3. APIの依存値が変化していたら、「自動で叩かれる」
5. データが用意できたら新しいデータでレンダリングされる
これ起因で無限ループしたというのは誰もが通る道だと思う
他にもいくつか問題がある
不要なAPI呼び出しが増えやすい
2. レスポンスのキャッシュ機構がない
上位概念追加やリファクタがかなり面倒なことになる
APIを叩く箇所部分を移動したときの影響範囲が大きい
コンポーネントのpropsを変更することを強いられる
propsが増えてくると、アプリの状態とUIの状態の区別がつかなくなってくる
本質が見えなくなっていく
正し、経験上、一箇所でもpropsをuseEffectで監視すると負の連鎖が続いていい経験はないkoushisa.icon 上手に使う方法よりも、避ける方法を知るべきである
上述の問題を解決するのが宣言的データフェッチ
koushisa.iconはこれでも満足できていない部分がある
もうちょっと直感的に書きたい
key管理がノイジーでコード量も増える
@koushisa: atomWithReactHookFormの戻り値にはRHFの値と同期しているRecoilのSelectorを含めているのでデータフェッチロジックに組み込める https://scrapbox.io/files/63ffd184f469dd001b660104.png
useQueryの依存値のためにhooksで値を参照してさらにuseEffectで同期するといった黒魔術実装が登場する可能性を減らせる hooksの絡まりによる中途半端な状態でレンダリングされることはなく、データの一貫性のある状態でレンダリングされる
描画とハンドラの構築に集中できる
難しさが廃されるのではなく、難しい部分が一箇所に集中する
これは、値というよりは式という言い方のほうがしっくりくる
利用側のことを意識せずにそれ単体で条件や仕様を記述できる
コンポーネントのコードを読みにいかなくても、この値に依存してるんだなと一目でわかる
透過的になる
適宜繋ぎこむまではモックを返すといったことができる
設計の柔軟性が生まれる
アプリ全体を通して純粋関数の割合を増やすことができる
何が言いたかったのか